package com.zqq.baselibrary.utils

import android.app.Activity
import android.content.Context
import android.util.DisplayMetrics
import android.view.View
import android.view.WindowManager
import android.view.inputmethod.InputMethodManager

/**
 * 单位转换工具
 * @author zqq on 2019/5/26.
 */
object DensityUtil {

    /**
     * 1.根据手机的分辨率从 dp 的单位 转成为 px(像素)，保证尺寸大小不变
     * @param dpValue （DisplayMetrics类中属性density）
     */
    fun dip2px(context: Context, dpValue: Float): Int {
        val scale = context.resources.displayMetrics.density
        return (dpValue * scale + 0.5f).toInt()
    }

    /**
     * 2.根据手机的分辨率从 px(像素) 的单位 转成为 dp，保证尺寸大小不变
     * @param pxValue （DisplayMetrics类中属性density）
     */
    fun px2dip(context: Context, pxValue: Float): Int {
        val scale = context.resources.displayMetrics.density
        return (pxValue / scale + 0.5f).toInt()
    }

    /**
     * 3.将px值转换为sp值，保证文字大小不变
     * @param pxValue （DisplayMetrics类中属性scaledDensity）
     */
    fun px2sp(context: Context, pxValue: Float): Int {
        val fontScale = context.resources.displayMetrics.scaledDensity
        return (pxValue / fontScale + 0.5f).toInt()
    }

    /**
     * 4.将sp值转换为px值，保证文字大小不变
     * @param spValue （DisplayMetrics类中属性scaledDensity）
     */
    fun sp2px(context: Context, spValue: Float): Int {
        val fontScale = context.resources.displayMetrics.scaledDensity
        return (spValue * fontScale + 0.5f).toInt()
    }


    /**
     * @Description: 获得屏幕高度
     */
    fun getHeight(activity: Activity): Int {
        var dm = DisplayMetrics()
        activity.windowManager.defaultDisplay.getMetrics(dm)
        return dm.heightPixels
    }


    /**
     * @Description: 获得屏幕宽度
     */
    fun getWidth(activity: Activity): Int {
        val dm = DisplayMetrics()
        activity.windowManager.defaultDisplay.getMetrics(dm)
        return dm.widthPixels
    }

    /**
     * @Description: 获得屏幕宽度
     */
    fun getWidth(context: Context): Int {
        val dm = DisplayMetrics()
        (context.getSystemService(Context.WINDOW_SERVICE) as WindowManager).defaultDisplay.getMetrics(dm)
        return dm.widthPixels
    }


    /**
     * 隐藏软键盘：如果输入法在窗口上已经显示，则隐藏，反之则显示
     */
    fun hideKeyboard(context: Context) {
        val manager: InputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        manager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS)
    }

    /**
     * 隐藏软键盘(只适用于Activity，不适用于Fragment)
     */
    fun hideKeyboard(activity: Activity){
        val view: View = activity.currentFocus
        if (view != null) {
            val manager: InputMethodManager = activity.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
            manager.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

            //隐藏软键盘
//            InputMethodManager manager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
//            manager.hideSoftInputFromWindow(view.getWindowToken(), 0);

        }
    }


    /**
     * 隐藏软键盘(可用于Activity，Fragment)
     * @param viewList 需要放的是当前界面所有触发软键盘弹出的控件。
     */
    fun hideKeyboard(context: Context, viewList: List<View>?) {
        if (viewList == null) return
        val manager = context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
        for (v in viewList) {
            manager.hideSoftInputFromWindow(v.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
        }
    }

}